package com.cqeec.demo.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 文件I/O操作工具类
 * 
 * @Title: FileIOUtil
 * @Descripton: 对文件进行读/写操作
 */
public class FileIOUtil {
	/**
	 * 根据指定路径读取文件
	 * 
	 * @decription 描述：把指定路径的文件读取到内存中<br/>
	 * @param filePath 需要读取的文件路径
	 * @return         返回内容字符串
	 */
	public static String readFileFromPath(String filePath) {
		StringBuilder sb = new StringBuilder();
		String line; // 用来保存每行读取的内容
		try {
			InputStream is = new FileInputStream(filePath);
			BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
			line = reader.readLine(); // 读取第一行
			while (line != null) { // 如果 line 为空说明读完了
				sb.append(line); // 将读到的内容添加到 sb 中
				sb.append("\r\n"); // 添加换行符
			    line = reader.readLine(); // 读取下一行
			}
			reader.close();
			is.close();
		} catch (Exception e) {
		}

        return sb.toString();
	}

	/**
	 * 把内容写入到文件
	 * 
	 * @decription 描述：把指定的内容写入到指定路径的文件中<br/>
	 * @param filePath 文件路径
	 * @param text     文件内容
	 */
	public static void writeFileFromText(String filePath, String text) {
		try {
			File file = new File(filePath);
			if (file.exists()) {
				file.delete();
			}
			FileOutputStream fos = new FileOutputStream(file);
            Writer os = new OutputStreamWriter(fos, "UTF-8");
            os.write(text);
            os.flush();
            fos.close();
		} catch (Exception e) {
		}
	}

	/**
	 * 获取目录下所有文件
	 * 
	 * @param realpath 文件路径
	 * @param files    文件列表
	 * @return
	 */
	public static List<File> getFiles(String realpath, List<File> files) {
		File realFile = new File(realpath);
		if (realFile.exists()) {
			if (realFile.isDirectory()) {
				File[] subFiles = realFile.listFiles();
				for (File file : subFiles) {
					if (file.isDirectory()) {
						getFiles(file.getAbsolutePath(), files);
					} else {
						files.add(file);
					}
				}
			} else {
				files.add(realFile);
			}
			return files;
		} else {
			return null;
		}
	}

	/**
	 * 获取目录下所有文件(按时间排序)
	 * 
	 * @param path     文件路径
	 * @param isAscend 排序方式：true升，false降
	 * @return
	 */
	public static List<File> getFileSortByTime(String path,
			final boolean isAscend) {

		List<File> list = getFiles(path, new ArrayList<File>());

		if (null != list && list.size() > 0) {

			Collections.sort(list, new Comparator<File>() {

				public int compare(File file, File newFile) {
					if (isAscend) {
						if (file.lastModified() > newFile.lastModified()) {
							return 1;
						} else if (file.lastModified() == newFile
								.lastModified()) {
							return 0;
						} else {
							return -1;
						}
					} else {
						if (file.lastModified() < newFile.lastModified()) {
							return 1;
						} else if (file.lastModified() == newFile
								.lastModified()) {
							return 0;
						} else {
							return -1;
						}
					}

				}
			});

		}

		return list;
	}

	/**
	 * 获取目录下所有文件(按大小排序)
	 * 
	 * @param path     文件路径
	 * @param isAscend 排序方式：true升，false降
	 * @return
	 */
	public static List<File> getFileSortBySize(String path,
			final boolean isAscend) {

		List<File> list = getFiles(path, new ArrayList<File>());

		if (null != list && list.size() > 0) {

			Collections.sort(list, new Comparator<File>() {

				public int compare(File file, File newFile) {
					if (isAscend) {
						if (file.length() > newFile.length()) {
							return 1;
						} else if (file.length() == newFile.length()) {
							return 0;
						} else {
							return -1;
						}
					} else {
						if (file.length() < newFile.length()) {
							return 1;
						} else if (file.length() == newFile.length()) {
							return 0;
						} else {
							return -1;
						}
					}

				}
			});

		}

		return list;
	}

	/**
	 * 获取目录下所有文件(按名称排序)
	 * 
	 * @param path     文件路径
	 * @param isAscend 排序方式：true升，false降
	 * @return
	 */
	public static List<File> getFileSortByName(String path,
			final boolean isAscend) {

		List<File> list = getFiles(path, new ArrayList<File>());

		if (null != list && list.size() > 0) {

			Collections.sort(list, new Comparator<File>() {

				public int compare(File file, File newFile) {

					if (isAscend) {
						return file.getName().compareTo(newFile.getName());
					} else {
						return newFile.getName().compareTo(file.getName());
					}

				}
			});

		}

		return list;
	}

	/**
	 * 对文件大小进行转换
	 * 
	 * @param size 文件大小单位为字节
	 * @return
	 */
	public static String convertFileSize(long size) {
		long kb = 1024;
		long mb = kb * 1024;
		long gb = mb * 1024;
		long tb = gb * 1024;

		if (size >= tb) {
			return String.format("%.1f TB", (float) size / tb);
		} else if (size >= gb) {
			return String.format("%.1f GB", (float) size / gb);
		} else if (size >= mb) {
			float f = (float) size / mb;
			return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
		} else if (size >= kb) {
			float f = (float) size / kb;
			return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
		} else {
			return String.format("%d B", size);
		}
	}

	/**
	 * 删除文件夹下的所有文件
	 * 
	 * @param delpath  文件路径
	 * @return
	 */
	public static boolean deleteFile(String delpath) {
		if (delpath == null || "".equals(delpath.trim())) {
			return false;
		}
		File file = new File(delpath);
		if (!file.exists()) {
			return false;
		}
		try {
			if (!file.isDirectory()) {
				file.delete();
			} else if (file.isDirectory()) {
				String[] filelist = file.list();
				for (int i = 0; i < filelist.length; i++) {
					File delfile = new File(delpath + "\\" + filelist[i]);
					if (!delfile.isDirectory()) {
						delfile.delete();
					} else if (delfile.isDirectory()) {
						deleteFile(delpath + "\\" + filelist[i]);
					}
				}
				file.delete();
			}
			return true;
		} catch (Exception e) {
			return false;
		}
	}

}
